Android HttpsURLCПодключение сообщения проблема

1

У меня есть активность ниже в моем приложении для Android, которое создает httpsurlconnection с аутентификацией. Затем он помещает некоторый XML и фиксирует ответ. Ответ, который я получаю с сервера, заключается в том, что XML-сообщение не получено, но в журнале нет исключений.

Я тестировал тот же код, что и приложение Java, и он отлично работает. Я искал высокий и низкий на пару недель, но не могу найти ответа.

Я установил файл android.permission.INTERNET в файле манифеста.

Любая помощь будет высоко оценена, я отправил свой код ниже минус имя пользователя и пароль, используемые в соединении.

Активность:

package com.payments.WorldPay;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class OrderModification extends Activity
{   
  TextView resultMessage;

  @Override
  public void onCreate(Bundle savedInstanceState)   
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.order_modification);

    Button submit = (Button)findViewById(R.id.submitButton);
    submit.setOnClickListener(submitModification);
    resultMessage = (TextView)this.findViewById(R.id.result);
  }

  OnClickListener submitModification = new OnClickListener()
    {
      public void onClick(View v) 
      {             
        StringBuffer xmlMod = new StringBuffer();

        xmlMod.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        xmlMod.append("<!DOCTYPE paymentService PUBLIC \"-//RBS WorldPay/DTD RBS WorldPay 
        PaymentService v1//EN\" \"http://dtd.wp3.rbsworldpay.com/paymentService_v1.dtd\">");
        xmlMod.append("<paymentService version=\"1.4\" merchantCode=\"TECHSUPPORT\">");
        xmlMod.append("<modify>");
        xmlMod.append("<orderModification orderCode=\"123456789\">");
        xmlMod.append("<cancel/>");
        xmlMod.append("</orderModification>");
        xmlMod.append("</modify>");
        xmlMod.append("</paymentService>");

        SendXml sendMod = new SendXml(xmlMod.toString());
        resultMessage.setText(sendMod.submitOrder());
      }
    };
}

Класс подключения:

package com.payments.WorldPay;

import java.io.*;
import java.net.*;
import javax.net.ssl.HttpsURLConnection;

public class SendXml
{    
  protected final static String merchantCode="username";    
  protected final static String xmlPassword="password";
  protected final static String envUrl="https://secure-test.wp3.rbsworldpay.com/jsp/merchant/xml/paymentService.jsp";    
  protected String xmlRequest;

  public SendXml(String xmlRequest)
  {       
    this.xmlRequest = xmlRequest;    
  }        

  public String submitOrder()    
  {     
    HttpsURLConnection conn = null;         

    try     
    {                       
      System.setProperty("http.keepAlive", "false");                                    

      Authenticator.setDefault(new MyAuthenticator());            
      URL url = new URL(envUrl);

      conn = (HttpsURLConnection)url.openConnection();                        
      conn.setRequestMethod("POST");            
      conn.setRequestProperty("Content-Type", "text/xml");            
      conn.setDoInput(true);            
      conn.setDoOutput(true);            
      conn.setUseCaches(false);            
      conn.setAllowUserInteraction(false);            
      conn.setConnectTimeout(30000);

      String utf8Xml = URLEncoder.encode(xmlRequest, "UTF-8");
      DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
      wr.writeBytes(utf8Xml);
      wr.flush();
      wr.close();

      InputStream response;

      if(conn.getResponseCode()==200)
      { 
        response = conn.getInputStream();
      }
      else
      { 
        response = conn.getErrorStream();
      }

      BufferedReader in = new BufferedReader(new InputStreamReader(response),4800); 
      StringBuffer responseBuffer = new StringBuffer();
      String line;

      while ((line = in.readLine()) != null) 
      { 
        responseBuffer.append(line);
      }

      in.close();

      return responseBuffer.toString();     
    }   
    catch(Exception e)
    {   
      return("Connection Error: "+e);
    }
    finally 
    {
      conn.disconnect(); 
    }
  }

  public static class MyAuthenticator extends Authenticator
  {
    public PasswordAuthentication getPasswordAuthentication()
    {
      return (new PasswordAuthentication(merchantCode, xmlPassword.toCharArray()));
    }
  }
}

Я снова запустил код как проект Java, и он отлично работает. Я включил пример запроса и ответа ниже.

Запрос:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE paymentService PUBLIC "-//RBS WorldPay/DTD RBS WorldPay PaymentService v1//EN"         
"http://dtd.wp3.rbsworldpay.com/paymentService_v1.dtd">
<paymentService version="1.4" merchantCode="TECHSUPPORT">
  <modify>
    <orderModification orderCode="123456789">
      <cancel/>
    </orderModification>
  </modify>
</paymentService>

Ответ:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE paymentService PUBLIC "-//Bibit//DTD Bibit PaymentService v1//EN" 
"http://dtd.bibit.com/paymentService_v1.dtd">
<paymentService version="1.4" merchantCode="TECHSUPPORT">
  <reply>
    <ok>
      <cancelReceived orderCode="123456789"/>
    </ok>
  </reply>
</paymentService>

Если я просто удалю > из элемента выше, я получу ошибку ниже.

Ответ на ошибку:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE paymentService PUBLIC "-//Bibit//DTD Bibit PaymentService v1//EN" 
"http://dtd.bibit.com/paymentService_v1.dtd">
<paymentService version="1.4" merchantCode="TECHSUPPORT">
  <reply>
    <error code="2">
      <![CDATA[Element type "modify" must be followed by either attribute specifications, ">" or 
      "/>".]]>
    </error>
  </reply>
</paymentService>

Спасибо заранее Даррен

  • 1
    Привет, Даррен. Пожалуйста, сделайте отступ в своем коде, его трудно прочитать таким образом.
  • 0
    Что произойдет, если вы не UrlEncode вашего xmlRequest?
Показать ещё 2 комментария
Теги:
httpurlconnection

1 ответ

3

Я не нашел ответа на свой вопрос, но приведенный ниже код позволил мне успешно опубликовать мой XML.

public ArrayList<PaymentResult> submitOrder()
{
    HttpClient client = new DefaultHttpClient();
    HttpPost request = new HttpPost(envUrl);
    UsernamePasswordCredentials login = new UsernamePasswordCredentials(merchantCode, xmlPassword);
    StringBuffer responseBuffer = null;     

    try
    {                       
        request.addHeader(BasicScheme.authenticate(login,"UTF-8",false)); 

        StringEntity xmlmessage = new StringEntity(xmlRequest,HTTP.UTF_8);
        xmlmessage.setContentType("text/xml");  
        request.setHeader("Content-Type","text/xml;charset=UTF-8");
        request.setEntity(xmlmessage); 

        HttpResponse response = client.execute(request);   
        BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        responseBuffer = new StringBuffer();
        String line;

        while ((line = in.readLine()) != null)
        {
            responseBuffer.append(line);
        }
        in.close();
    }   
    catch(Exception e)
    {
        e.printStackTrace();
    }
    return parseResponse(responseBuffer.toString());
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню