Android:通过Http Get或Post Request

时间:2015-09-22 14:15:17

标签: java android soap httprequest

我需要将图片上传到网络服务器,并且它需要ImageContent在文件中的字节[],它说base64Binary,但我尝试了base64编码的字符串,没有用

这是我的班级:

private class background extends AsyncTask<byte[],Void,String> {

    String url = "http://www.sample.com/_mobfiles/CLS_Account.asmx/UploadImage";
    String charset = "UTF-8";  
    String param1 = "jpg";

    @Override
    protected String doInBackground(byte[]... params) {

        try {
            String query = String.format("ImageContent=%s&imageExtenstion=%s", params[0], URLEncoder.encode(param2, charset));
            URLConnection connection = new URL(url + "?" + query).openConnection();
            connection.setRequestProperty("Accept-Charset", charset);
            InputStream response = connection.getInputStream();
            for (Map.Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
                System.out.println(header.getKey() + "=" + header.getValue());
            }
            String contentType = connection.getHeaderField("Content-Type");
            String charset = null;
            for (String param : contentType.replace(" ", "").split(";")) {
                if (param.startsWith("charset=")) {
                    charset = param.split("=", 2)[1];
                    break;
                }
            }
            if (charset != null) {
                try (BufferedReader reader = new BufferedReader(new InputStreamReader(response, charset))) {
                    for (String line; (line = reader.readLine()) != null;) {
                        System.out.println(line);
                    }
                }
            }
            else {
                ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                int nRead;
                byte[] data = new byte[16384];
                while ((nRead = response.read(data, 0, data.length)) != -1) {
                    buffer.write(data, 0, nRead);
                }
                buffer.flush();
                byte[] arr = buffer.toByteArray();
                String decoded = new String(arr, "UTF-8");
                System.out.println(decoded);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

返回(java.io.FileNotFoundException)

和Base64编码返回(java.net.ProtocolException:意外状态行:对象已移动)

这是Doc:

HTTP GET

以下是HTTP GET请求和响应示例。显示的占位符需要替换为实际值。

GET /_mobfiles/CLS_Account.asmx/UploadImage?ImageContent=base64Binary&imageExtenstion=string HTTP/1.1
Host: www.sample.com

并且响应就像

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">string</string>

HTTP POST

以下是HTTP POST请求和响应示例。显示的占位符需要替换为实际值。

POST /_mobfiles/CLS_Account.asmx/UploadImage HTTP/1.1
Host: www.sample.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length

ImageContent=base64Binary&imageExtenstion=string

并且响应就像

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">string</string>

2 个答案:

答案 0 :(得分:0)

您可以在Chrome控制台中尝试此操作并告诉输出。

xmlhttp=new XMLHttpRequest();
    var url = '/_mobfiles/CLS_Account.asmx/UploadImage?';
    var base64 ='R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw=='
    xmlhttp.open("GET",url + 'ImageContent='+base64+'&imageExtenstion=gif',true);
    xmlhttp.send();
    console.log(xmlhttp.response)

试试这个。如果这也失败了,你必须检查服务器。 Atleast提供负责处理此问题的服务器方法。

xmlhttp=new XMLHttpRequest();
var url = '/_mobfiles/CLS_Account.asmx/UploadImage?';
var base64 ='R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw=='
xmlhttp.open("POST",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send('ImageContent="'+base64+'"&imageExtenstion="gif"');
console.log(xmlhttp)

使用获取请求并使用

var base64 ='R0lGODlhDwAPAKECAAAAzMzM%2F%2F%2F%2F%2FwAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH%2BH09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw%3D%3D'

我确信这应该有效。我真的很抱歉我的坏我应该没有犯这样一个愚蠢的错误/

答案 1 :(得分:0)

我找不到方法,只能发送整个SOAP信封

所以从后台线程AsyncTask我执行时调用了callSOAPWebService(String data)

ByteArrayOutputStream stream = new ByteArrayOutputStream();
Bitmap resizedBitmap = Bitmap.createScaledBitmap(thumbnail, 150, 150, false);
resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100,stream);
byte[] byteArray = stream.toByteArray();
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
new ImageUpload().execute(encoded);
来自UI线程

和背景

@Override
        protected String doInBackground(String... params) {
            callSOAPWebService(params[0]);
            return null;
        }

callSOAPWebService如下

private boolean callSOAPWebService(String data) {
        OutputStream out = null;
        int respCode;
        boolean isSuccess = false;
        URL url;
        HttpURLConnection httpURLConnection = null;
        try {
            url = new URL(GetData.NonOpDomain);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            do {
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setRequestProperty("Connection", "keep-alive");
                httpURLConnection.setRequestProperty("Content-Type", "text/xml");
                httpURLConnection.setRequestProperty("SendChunked", "True");
                httpURLConnection.setRequestProperty("UseCookieContainer", "True");
                HttpURLConnection.setFollowRedirects(false);
                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);
                httpURLConnection.setUseCaches(true);
                httpURLConnection.setRequestProperty("Content-length", getReqData(data).length + "");
                httpURLConnection.setReadTimeout(100 * 1000);
                // httpURLConnection.setConnectTimeout(10 * 1000);
                httpURLConnection.connect();
                out = httpURLConnection.getOutputStream();
                if (out != null) {
                    out.write(getReqData(data));
                    out.flush();
                }
                respCode = httpURLConnection.getResponseCode();
                Log.e("respCode", ":" + respCode);
            } while (respCode == -1);

            // If it works fine
            if (respCode == 200) {
                try {
                    InputStream responce = httpURLConnection.getInputStream();
                    String str = convertStreamToString(responce);
                    System.out.println(".....data....." + str);
                    InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8"));
                    XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
                    XmlPullParser myparser = xmlFactoryObject.newPullParser();
                    myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
                    myparser.setInput(is, null);
                    parseXMLAndStoreIt(myparser);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            } else {
                isSuccess = false;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out = null;
            }
            if (httpURLConnection != null) {
                httpURLConnection.disconnect();
                httpURLConnection = null;
            }
        }
        return isSuccess;
    }

和辅助方法

public volatile boolean parsingComplete = true;

public void parseXMLAndStoreIt(XmlPullParser myParser) {
    int event;
    String text = null;
    try {
        event = myParser.getEventType();
        while (event != XmlPullParser.END_DOCUMENT) {
            String name = myParser.getName();

            switch (event) {
                case XmlPullParser.START_TAG:
                    break;

                case XmlPullParser.TEXT:
                    text = myParser.getText();
                    break;
                case XmlPullParser.END_TAG:
                    if (name.equals("UploadImageResult")) {
                        uploadedImage = text;
                        uploadedImage = uploadedImage.replace("\"", "");
                    }
                    break;
            }
            event = myParser.next();
        }
        parsingComplete = false;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static String createSoapHeader() {
    String soapHeader;

    soapHeader = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
            + "<soap:Envelope "
            + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""
            + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
            + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" + ">";
    return soapHeader;
}

public static byte[] getReqData(String data) {
    StringBuilder requestData = new StringBuilder();

    requestData.append(createSoapHeader());
    requestData.append("<soap:Body>" + "<UploadImage" + " xmlns=\"http://example.org/\">" + "<ImageContent>").append(data).append("</ImageContent>\n").append("<imageExtenstion>jpg</imageExtenstion>").append("</UploadImage> </soap:Body> </soap:Envelope>");
    Log.d("reqData: ", requestData.toString());
    return requestData.toString().trim().getBytes();
}

private static String convertStreamToString(InputStream is)
        throws UnsupportedEncodingException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,
            "UTF-8"));
    StringBuilder sb = new StringBuilder();
    String line;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();

}

希望它能帮助将来的某个人